// 发送 WebSocket 消息
package websocket

import (
	"encoding/json"
	"fmt"
	"log"
	"time"
)

// Messenger WebSocket 消息发送工具
type Messenger struct {
	manager *WebSocketManager
}

// NewMessenger 创建消息发送器
func NewMessenger(manager *WebSocketManager) *Messenger {
	return &Messenger{manager: manager}
}

/******************** 基础消息发送 ********************/

// SendToClient 发送给指定客户端
// clientID: 客户端ID
// message: 字符串消息内容
// 返回: 是否发送成功
func (m *Messenger) SendToClient(clientID string, message string) bool {
	return m.manager.SendToClient(clientID, []byte(message))
}

// SendToUser 发送给指定用户的所有客户端
// userID: 用户ID
// message: 字符串消息内容
// 返回: 成功发送的客户端数量
func (m *Messenger) SendToUser(userID string, message string) int {
	return m.manager.SendToUser(userID, []byte(message))
}

// Broadcast 广播消息给所有客户端
// message: 字符串消息内容
func (m *Messenger) Broadcast(message string) {
	m.manager.SendBroadcast([]byte(message))
}

/******************** JSON 消息封装 ********************/

type JsonMessage struct {
	Type    string      `json:"type"`    // 消息类型
	Data    interface{} `json:"data"`    // 消息内容
	SentAt  int64       `json:"sentAt"`  // 发送时间戳
	TraceID string      `json:"traceId"` // 追踪ID(可选)
}

// SendJSONToClient 发送JSON消息给指定客户端
func (m *Messenger) SendJSONToClient(clientID string, msgType string, data interface{}) bool {
	jsonMsg := m.buildJSONMessage(msgType, data)
	return m.SendToClient(clientID, jsonMsg)
}

// SendJSONToUser 发送JSON消息给指定用户
func (m *Messenger) SendJSONToUser(userID string, msgType string, data interface{}) int {
	jsonMsg := m.buildJSONMessage(msgType, data)
	return m.SendToUser(userID, jsonMsg)
}

// BroadcastJSON 广播JSON消息
func (m *Messenger) BroadcastJSON(msgType string, data interface{}) {
	jsonMsg := m.buildJSONMessage(msgType, data)
	m.Broadcast(jsonMsg)
}

// 构建JSON消息
func (m *Messenger) buildJSONMessage(msgType string, data interface{}) string {
	msg := JsonMessage{
		Type:   msgType,
		Data:   data,
		SentAt: time.Now().Unix(),
	}
	jsonData, err := json.Marshal(msg)
	if err != nil {
		log.Printf("JSON编码失败: %v", err)
		return fmt.Sprintf(`{"type":"error","data":"json encode error"}`)
	}
	return string(jsonData)
}

/******************** 业务快捷方法 ********************/

// NotifyOnline 通知用户上线
func (m *Messenger) NotifyOnline(userID string) {
	m.SendJSONToUser(userID, "user_online", map[string]string{
		"userId":    userID,
		"timestamp": time.Now().Format(time.RFC3339),
	})
}

// NotifyNewMessage 通知新消息
func (m *Messenger) NotifyNewMessage(senderID, receiverID string, content string) {
	// 发给发送方(用于消息回显)
	m.SendJSONToUser(senderID, "new_message", map[string]string{
		"from":    senderID,
		"to":      receiverID,
		"content": content,
		"isSelf":  "true",
	})

	// 发给接收方
	m.SendJSONToUser(receiverID, "new_message", map[string]string{
		"from":    senderID,
		"content": content,
		"isSelf":  "false",
	})
}

// SystemAlert 系统警报
func (m *Messenger) SystemAlert(title, content string) {
	m.BroadcastJSON("system_alert", map[string]string{
		"title":   title,
		"content": content,
		"level":   "urgent",
	})
}
